package com.ctshk.rpc.booking.service;


import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.rpc.booking.dto.*;
import com.ctshk.rpc.booking.dto.outside.SupplierOrderOutsidePageDTO;
import com.ctshk.rpc.booking.dto.outside.admission.query.SupplierOrderAdmissionDTO;
import com.ctshk.rpc.booking.dto.outside.air.query.SupplierOrderAirDTO;
import com.ctshk.rpc.booking.dto.outside.car.query.SupplierOrderCarDTO;
import com.ctshk.rpc.booking.dto.outside.food.query.SupplierOrderFoodDTO;
import com.ctshk.rpc.booking.dto.outside.hotel.query.SupplierOrderHotelDTO;
import com.ctshk.rpc.booking.dto.outside.other.query.SupplierOrderOtherDTO;
import com.ctshk.rpc.booking.dto.outside.ship.query.SupplierOrderShipDTO;
import com.ctshk.rpc.booking.dto.outside.train.query.SupplierOrderTrainDTO;
import com.ctshk.rpc.booking.dto.system.admission.info.SupplierOrderSystemAdmissionInfoDTO;
import com.ctshk.rpc.booking.dto.system.admission.page.SupplierOrderAdmissionPageDTO;
import com.ctshk.rpc.booking.dto.system.air.info.SupplierOrderSystemAirInfoDTO;
import com.ctshk.rpc.booking.dto.system.air.page.SupplierOrderAirPageDTO;
import com.ctshk.rpc.booking.dto.system.airexpress.info.SupplierOrderSystemAirExpressInfoDTO;
import com.ctshk.rpc.booking.dto.system.airexpress.page.SupplierOrderAirExpressPageDTO;
import com.ctshk.rpc.booking.dto.system.bus.info.SupplierOrderSystemBusInfoDTO;
import com.ctshk.rpc.booking.dto.system.bus.page.SupplierOrderBusPageDTO;
import com.ctshk.rpc.booking.dto.system.commodity.info.SupplierOrderSystemCommodityInfoDTO;
import com.ctshk.rpc.booking.dto.system.commodity.page.SupplierOrderCommodityPageDTO;
import com.ctshk.rpc.booking.dto.system.hotel.info.SupplierOrderSystemHotelInfoDTO;
import com.ctshk.rpc.booking.dto.system.hotel.page.SupplierOrderHotelPageDTO;
import com.ctshk.rpc.booking.dto.system.insurance.info.SupplierOrderSystemInsuranceInfoDTO;
import com.ctshk.rpc.booking.dto.system.insurance.page.SupplierOrderInsurancePageDTO;
import com.ctshk.rpc.booking.dto.system.localfun.info.SupplierOrderSystemLocalFunInfoDTO;
import com.ctshk.rpc.booking.dto.system.localfun.page.SupplierOrderLocalFunPageDTO;
import com.ctshk.rpc.booking.dto.system.ship.info.SupplierOrderSystemShipInfoDTO;
import com.ctshk.rpc.booking.dto.system.ship.page.SupplierOrderShipPageDTO;
import com.ctshk.rpc.booking.dto.system.stampduty.info.SupplierOrderSystemStampDutyInfoDTO;
import com.ctshk.rpc.booking.dto.system.stampduty.page.SupplierOrderStampDutyPageDTO;
import com.ctshk.rpc.booking.dto.system.train.info.SupplierOrderSystemTrainInfoDTO;
import com.ctshk.rpc.booking.dto.system.train.page.SupplierOrderTrainPageDTO;
import com.ctshk.rpc.booking.dto.system.visa.info.SupplierOrderSystemVisaInfoDTO;
import com.ctshk.rpc.booking.dto.system.visa.page.SupplierOrderVisaPageDTO;
import com.ctshk.rpc.booking.req.SupplierOrderFinancePageReq;
import com.ctshk.rpc.booking.req.SupplierOrderFinishPageReq;
import com.ctshk.rpc.booking.req.SupplierOrderPageReq;
import com.ctshk.rpc.booking.req.SupplierOrderUnsubBookingPageReq;
import com.ctshk.rpc.booking.req.outside.SupplierOrderOutsidePageReq;
import com.ctshk.rpc.booking.req.outside.admission.save.SupplierOrderOutsideAdmissionSaveReq;
import com.ctshk.rpc.booking.req.outside.air.save.SupplierOrderOutsideAirSaveReq;
import com.ctshk.rpc.booking.req.outside.approval.SupplierOrderOutsideApprovalReq;
import com.ctshk.rpc.booking.req.outside.car.save.SupplierOrderOutsideCarSaveReq;
import com.ctshk.rpc.booking.req.outside.food.save.SupplierOrderOutsideFoodSaveReq;
import com.ctshk.rpc.booking.req.outside.hotel.save.SupplierOrderOutsideHotelSaveReq;
import com.ctshk.rpc.booking.req.outside.other.save.SupplierOrderOutsideOtherSaveReq;
import com.ctshk.rpc.booking.req.outside.ship.save.SupplierOrderOutsideShipSaveReq;
import com.ctshk.rpc.booking.req.outside.train.save.SupplierOrderOutsideTrainSaveReq;
import com.ctshk.rpc.booking.req.system.SupplierOrderSystemConfirmReq;
import com.ctshk.rpc.booking.req.system.SupplierOrderSystemFreeCallConfirmReq;
import com.ctshk.rpc.booking.req.system.admission.add.SupplierOrderSystemAdmissionAddReq;
import com.ctshk.rpc.booking.req.system.admission.edit.SupplierOrderSystemAdmissionEditReq;
import com.ctshk.rpc.booking.req.system.admission.page.SupplierOrderSystemAdmissionPageReq;
import com.ctshk.rpc.booking.req.system.air.add.SupplierOrderSystemAirAddReq;
import com.ctshk.rpc.booking.req.system.air.edit.SupplierOrderSystemAirEditReq;
import com.ctshk.rpc.booking.req.system.air.page.SupplierOrderSystemAirPageReq;
import com.ctshk.rpc.booking.req.system.airexpress.add.SupplierOrderSystemAirExpressAddReq;
import com.ctshk.rpc.booking.req.system.airexpress.page.SupplierOrderSystemAirExpressPageReq;
import com.ctshk.rpc.booking.req.system.bus.add.SupplierOrderSystemBusAddReq;
import com.ctshk.rpc.booking.req.system.bus.edit.SupplierOrderSystemBusEditReq;
import com.ctshk.rpc.booking.req.system.bus.page.SupplierOrderSystemBusPageReq;
import com.ctshk.rpc.booking.req.system.commodity.add.SupplierOrderSystemCommodityAddReq;
import com.ctshk.rpc.booking.req.system.commodity.edit.SupplierOrderSystemCommodityEditReq;
import com.ctshk.rpc.booking.req.system.commodity.page.SupplierOrderSystemCommodityPageReq;
import com.ctshk.rpc.booking.req.system.hotel.add.SupplierOrderSystemHotelAddReq;
import com.ctshk.rpc.booking.req.system.hotel.edit.SupplierOrderSystemHotelEditReq;
import com.ctshk.rpc.booking.req.system.hotel.page.SupplierOrderSystemHotelPageReq;
import com.ctshk.rpc.booking.req.system.insurance.add.SupplierOrderSystemInsuranceAddReq;
import com.ctshk.rpc.booking.req.system.insurance.page.SupplierOrderSystemInsurancePageReq;
import com.ctshk.rpc.booking.req.system.localfun.add.SupplierOrderSystemLocalFunAddReq;
import com.ctshk.rpc.booking.req.system.localfun.edit.SupplierOrderSystemLocalFunEditReq;
import com.ctshk.rpc.booking.req.system.localfun.page.SupplierOrderSystemLocalFunPageReq;
import com.ctshk.rpc.booking.req.system.ship.add.SupplierOrderSystemShipAddReq;
import com.ctshk.rpc.booking.req.system.ship.edit.SupplierOrderSystemShipEditReq;
import com.ctshk.rpc.booking.req.system.ship.page.SupplierOrderSystemShipPageReq;
import com.ctshk.rpc.booking.req.system.stampduty.add.SupplierOrderSystemStampDutyAddReq;
import com.ctshk.rpc.booking.req.system.stampduty.page.SupplierOrderSystemStampDutyPageReq;
import com.ctshk.rpc.booking.req.system.train.add.SupplierOrderSystemTrainAddReq;
import com.ctshk.rpc.booking.req.system.train.edit.SupplierOrderSystemTrainEditReq;
import com.ctshk.rpc.booking.req.system.train.page.SupplierOrderSystemTrainPageReq;
import com.ctshk.rpc.booking.req.system.visa.add.SupplierOrderSystemVisaAddReq;
import com.ctshk.rpc.booking.req.system.visa.edit.SupplierOrderSystemVisaEditReq;
import com.ctshk.rpc.booking.req.system.visa.page.SupplierOrderSystemVisaPageReq;

import java.util.List;

/**
 * <p>
 * 统一供应商预订单 服务类
 * </p>
 *
 * @author 谢诗宏
 * @since 2021-03-09
 */
public interface ISupplierOrderService {
    /**
     * 查询供应商往来预订单分页列表-财务
     *
     * @param supplierOrderAllFinancePageReq
     * @return
     */
    PageResponse<SupplierOrderFinishPageDTO> getFinanceContactsPage(SupplierOrderFinancePageReq supplierOrderAllFinancePageReq);

    /**
     * 查询已完成供应商预订单分页列表
     *
     * @param supplierOrderFinishPageReq
     * @return
     */
    PageResponse<SupplierOrderFinishPageDTO> getFinishPage(SupplierOrderFinishPageReq supplierOrderFinishPageReq);


    PageResponse<SupplierOrderUnsubBookingPageDTO> getUnsubBookingPage(SupplierOrderUnsubBookingPageReq supplierOrderUnsubBookingPageReq);

    /**
     * 查询供应商预订单分页列表
     *
     * @param supplierOrderPageReq
     * @return
     */
    PageResponse<SupplierOrderPageDTO> selectPage(SupplierOrderPageReq supplierOrderPageReq);

    /**
     * 根据Ids查询供应商预订单列表
     *
     * @param ids
     * @return
     */
    Result<List<SupplierOrderDTO>> selectListByIds(List<Long> ids);

    /**
     * 根据id查询供应商预订单
     *
     * @param id
     * @return
     */
    Result<SupplierOrderDTO> selectListById(Long id);

    /**
     * 团队预订-提交审批
     * @param id
     * @param userId
     * @return
     */
    Result submitOutsideApproval(long id, Long userId);

    /**
     * 团队预订审批
     *
     * @param supplierOrderOutsideAirSaveReq
     * @return
     */
    Result approvalOutside(SupplierOrderOutsideApprovalReq supplierOrderOutsideAirSaveReq);

    PageResponse<SupplierOrderOutsidePageDTO> selectOutsideList(SupplierOrderOutsidePageReq supplierOrderOutsidePageReq);

    Result saveOutsideAir(SupplierOrderOutsideAirSaveReq supplierOrderOutsideAirSaveReq, Long userId);

    SupplierOrderAirDTO selectOutsideAirById(Long id, Long userId);

    Result saveOutsideTrain(SupplierOrderOutsideTrainSaveReq supplierOrderOutsideTrainSaveReq, Long userId);

    SupplierOrderTrainDTO selectOutsideTrainById(Long id, Long userId);

    Result saveOutsideShip(SupplierOrderOutsideShipSaveReq supplierOrderOutsideShipSaveReq, Long userId);

    SupplierOrderShipDTO selectOutsideShipById(Long id, Long userId);

    Result saveOutsideFood(SupplierOrderOutsideFoodSaveReq supplierOrderOutsideFoodSaveReq, Long userId);

    SupplierOrderFoodDTO selectOutsideFoodById(Long id, Long userId);

    Result<Long> saveOutsideCar(SupplierOrderOutsideCarSaveReq supplierOrderOutsideCarSaveReq, Long userId);

    SupplierOrderCarDTO selectOutsideCarById(Long id, Long userId);

    Result<Long> saveOutsideOther(SupplierOrderOutsideOtherSaveReq supplierOrderOutsideOtherSaveReq, Long userId);

    SupplierOrderOtherDTO selectOutsideOtherById(Long id, Long userId);

    Result<Long> saveOutsideHotel(SupplierOrderOutsideHotelSaveReq supplierOrderOutsideHotelSaveReq, Long userId);

    SupplierOrderHotelDTO selectOutsideHotelById(Long id, Long userId);

    /**
     * 供应商预订-团队预订-门票保存
     *
     * @param supplierOrderOutsideAdmissionSaveReq
     * @param userId
     * @return
     */
    Result<Long> saveOutsideAdmission(SupplierOrderOutsideAdmissionSaveReq supplierOrderOutsideAdmissionSaveReq, Long userId);

    SupplierOrderAdmissionDTO selectOutsideAdmissionById(Long id, Long userId);

    /**
     * 供应商预订-自由行预订-酒店编辑
     *
     * @param supplierOrderSystemHotelEditReq
     * @param userId
     * @return
     */
    Result<Long> editSystemHotel(SupplierOrderSystemHotelEditReq supplierOrderSystemHotelEditReq, Long userId);

    /**
     * 供应商预订-自由行预订-酒店新增(自由行付款专用)
     *
     * @param supplierOrderSystemHotelAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemHotel(SupplierOrderSystemHotelAddReq supplierOrderSystemHotelAddReq, Long userId);

    PageResponse<SupplierOrderHotelPageDTO> selectSystemHotelList(SupplierOrderSystemHotelPageReq supplierOrderSystemHotelPageReq);

    SupplierOrderSystemHotelInfoDTO getSystemHotel(Long id);

    PageResponse<SupplierOrderTrainPageDTO> selectSystemTrainList(SupplierOrderSystemTrainPageReq supplierOrderSystemTrainPageReq);

    /**
     * 供应商预订-自由行预订-火车票新增(自由行付款专用)
     *
     * @param supplierOrderSystemTrainAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemTrain(SupplierOrderSystemTrainAddReq supplierOrderSystemTrainAddReq, Long userId);

    Result<Long> editSystemTrain(SupplierOrderSystemTrainEditReq supplierOrderSystemTrainEditReq, Long userId);

    SupplierOrderSystemTrainInfoDTO getSystemTrain(Long id);

    PageResponse<SupplierOrderBusPageDTO> selectSystemBusList(SupplierOrderSystemBusPageReq supplierOrderSystemBusPageReq);

    /**
     * 供应商预订-自由行预订-巴士新增(自由行付款专用)
     *
     * @param supplierOrderSystemBusAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemBus(SupplierOrderSystemBusAddReq supplierOrderSystemBusAddReq, Long userId);

    Result<Long> editSystemBus(SupplierOrderSystemBusEditReq supplierOrderSystemBusEditReq, Long userId);

    SupplierOrderSystemBusInfoDTO getSystemBus(Long id);

    PageResponse<SupplierOrderAirPageDTO> selectSystemAirList(SupplierOrderSystemAirPageReq supplierOrderSystemAirPageReq);

    /**
     * 供应商预订-自由行预订-航班新增(自由行付款专用)
     *
     * @param supplierOrderSystemAirAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemAir(SupplierOrderSystemAirAddReq supplierOrderSystemAirAddReq, Long userId);

    Result<Long> editSystemAir(SupplierOrderSystemAirEditReq supplierOrderSystemAirEditReq, Long userId);

    SupplierOrderSystemAirInfoDTO getSystemAir(Long id);

    PageResponse<SupplierOrderShipPageDTO> selectSystemShipList(SupplierOrderSystemShipPageReq supplierOrderSystemShipPageReq);

    /**
     * 供应商预订-自由行预订-船票新增(自由行付款专用)
     *
     * @param supplierOrderSystemShipAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemShip(SupplierOrderSystemShipAddReq supplierOrderSystemShipAddReq, Long userId);

    Result<Long> editSystemShip(SupplierOrderSystemShipEditReq supplierOrderSystemShipEditReq, Long userId);

    SupplierOrderSystemShipInfoDTO getSystemShip(Long id);

    PageResponse<SupplierOrderAdmissionPageDTO> selectSystemAdmissionList(SupplierOrderSystemAdmissionPageReq supplierOrderSystemAdmissionPageReq);

    /**
     * 供应商预订-自由行预订-门票票新增(自由行付款专用)
     *
     * @param supplierOrderSystemAdmissionAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemAdmission(SupplierOrderSystemAdmissionAddReq supplierOrderSystemAdmissionAddReq, Long userId);

    Result<Long> editSystemAdmission(SupplierOrderSystemAdmissionEditReq supplierOrderSystemAdmissionEditReq, Long userId);

    SupplierOrderSystemAdmissionInfoDTO getSystemAdmission(Long id);

    PageResponse<SupplierOrderInsurancePageDTO> selectSystemInsuranceList(SupplierOrderSystemInsurancePageReq supplierOrderSystemInsurancePageReq);

    /**
     * 供应商预订-自由行预订-保险新增(自由行付款专用)
     *
     * @param supplierOrderSystemInsuranceAddReq
     * @param userId
     * @return
     */
    Result<String> addSystemInsurance(SupplierOrderSystemInsuranceAddReq supplierOrderSystemInsuranceAddReq, Long userId);

    SupplierOrderSystemInsuranceInfoDTO getSystemInsurance(Long id);

    PageResponse<SupplierOrderStampDutyPageDTO> selectSystemStampDutyList(SupplierOrderSystemStampDutyPageReq supplierOrderSystemStampDutyPageReq);

    /**
     * 供应商预订-自由行预订-印花税新增(自由行付款专用)
     *
     * @param supplierOrderSystemStampDutyAddReq
     * @param userId
     * @return
     */
    Result<String> addSystemStampDuty(SupplierOrderSystemStampDutyAddReq supplierOrderSystemStampDutyAddReq, Long userId);

    SupplierOrderSystemStampDutyInfoDTO getSystemStampDuty(Long id);

    PageResponse<SupplierOrderAirExpressPageDTO> selectSystemAirExpressList(SupplierOrderSystemAirExpressPageReq supplierOrderSystemAirExpressPageReq);

    /**
     * 供应商预订-自由行预订-机场快线新增(自由行付款专用)
     *
     * @param supplierOrderSystemAirExpressAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemAirExpress(SupplierOrderSystemAirExpressAddReq supplierOrderSystemAirExpressAddReq, Long userId);

    SupplierOrderSystemAirExpressInfoDTO getSystemAirExpress(Long id);

    PageResponse<SupplierOrderVisaPageDTO> selectSystemVisaList(SupplierOrderSystemVisaPageReq supplierOrderSystemVisaPageReq);

    /**
     * 供应商预订-自由行预订-签证新增(自由行付款专用)
     *
     * @param supplierOrderSystemVisaAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemVisa(SupplierOrderSystemVisaAddReq supplierOrderSystemVisaAddReq, Long userId);

    Result<Long> editSystemVisa(SupplierOrderSystemVisaEditReq supplierOrderSystemVisaEditReq, Long userId);

    SupplierOrderSystemVisaInfoDTO getSystemVisa(Long id);

    PageResponse<SupplierOrderLocalFunPageDTO> selectSystemLocalFunList(SupplierOrderSystemLocalFunPageReq supplierOrderSystemLocalFunPageReq);

    /**
     * 供应商预订-自由行预订-本地玩乐新增(自由行付款专用)
     *
     * @param supplierOrderSystemLocalFunAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemLocalFun(SupplierOrderSystemLocalFunAddReq supplierOrderSystemLocalFunAddReq, Long userId);

    Result<Long> editSystemLocalFun(SupplierOrderSystemLocalFunEditReq supplierOrderSystemLocalFunEditReq, Long userId);

    SupplierOrderSystemLocalFunInfoDTO getSystemLocalFun(Long id);

    PageResponse<SupplierOrderCommodityPageDTO> selectSystemCommodityList(SupplierOrderSystemCommodityPageReq supplierOrderSystemCommodityPageReq);

    /**
     * 供应商预订-自由行预订-商品新增(自由行付款专用)
     *
     * @param supplierOrderSystemCommodityAddReq
     * @param userId
     * @return
     */
    Result<Long> addSystemCommodity(SupplierOrderSystemCommodityAddReq supplierOrderSystemCommodityAddReq, Long userId);

    Result<Long> editSystemCommodity(SupplierOrderSystemCommodityEditReq supplierOrderSystemCommodityEditReq, Long userId);

    SupplierOrderSystemCommodityInfoDTO getSystemCommodity(Long id);

    /**
     * 供应商自用-确认预订(手工产品-二次确认，外挂单-后台下单)
     *
     * @param supplierOrderSystemConfirmReq
     * @param userId
     * @return
     */
    Result systemConfirm(SupplierOrderSystemConfirmReq supplierOrderSystemConfirmReq, Long userId);

    /**
     * 确认预订(自由行外挂单-门市下单调用)
     *
     * @param supplierOrderSystemFreeCallConfirmReq
     * @param userId
     * @return
     *
     */
    Result freeCallSystemConfirm(SupplierOrderSystemFreeCallConfirmReq supplierOrderSystemFreeCallConfirmReq, Long userId);

    /**
     * 根据团期ID查询供应商预订和财务信息(团模块专用)
     * @param scheduleId
     * @param userId
     * @return
     */
    Result<List<SupplierOrderFinanceListDTO>> queryFinanceListByScheduleId(Long scheduleId, Long userId);
}
